# 1.程序
salary = input('请输入薪资：')

# 计算出缴税额，存入变量tax
tax = int(salary) * 25 / 100
# 转化为字符串，方便下面的字符串拼接
taxStr = str(tax)

# 计算出税后工资，存入变量 aftertax
aftertax = int(salary) * 75 / 100
# 转化为字符串，方便下面的字符串拼接
aftertaxStr = str(aftertax)

# 2.f-string 格式化
# f-string 格式化 就是在字符串模板前面加上f，然后占位符使用{} ,里面直接放入对应的数据对象。
print(f'税前薪资是：{salary}元， 缴税：{tax}元， 税后薪资是：{aftertax}元')

# 2.1.指定宽度
# 同样，为了输出对齐，我们需要指定填入的字符串的宽度。
# 方法是，在括号里面的变量后面加上 :宽度值
# f'{salary:10}' 就指定了 宽度为10 个字符， 如果填入的字符串不足10个字符，就在前面加上空格
money = 10000
print(f'{money:10}')  # 10000

# 示例：
# 员工 1
salary1 = 8000
tax1 = int(salary1) * 25 / 100
aftertax1 = int(salary1) * 75 / 100
print(f'税前薪资是：{salary1:8}元， 缴税：{tax1:8}元， 税后薪资是：{aftertax1:8}元')

# 员工 2
salary2 = 15000
tax2 = int(salary2) * 25 / 100
aftertax2 = int(salary2) * 75 / 100
print(f'税前薪资是：{salary2:8}元， 缴税：{tax2:8}元， 税后薪资是：{aftertax2:8}元')

# 员工 3
salary3 = 100000
tax3 = int(salary3) * 25 / 100
aftertax3 = int(salary3) * 75 / 100
print(f'税前薪资是：{salary3:8}元， 缴税：{tax3:8}元， 税后薪资是：{aftertax3:8}元')


# 运行一下结果如下：
# 税前薪资是：    8000元， 缴税：  2000.0元， 税后薪资是：  6000.0元
# 税前薪资是：   15000元， 缴税：  3750.0元， 税后薪资是： 11250.0元
# 税前薪资是：  100000元， 缴税： 25000.0元， 税后薪资是： 75000.0元


# 优化：
def calcTax(salary4):
    tax4 = int(salary4) * 25 / 100
    aftertax4 = int(salary4) * 75 / 100
    print(f'税前薪资是：{salary4:8}元， 缴税：{tax4:8}元， 税后薪资是：{aftertax4:8}元')


# 员工 1
calcTax(8000)
# 员工 2
calcTax(15000)
# 员工 3
calcTax(100000)

# 2.2.左右对齐
# 数字对象来说，缺省为 右边对齐，而字符串缺省为 左边对齐
print(f"|{'abc':10}|{300:10}|")  # '|abc       |       300|'

# 如果我们想指定左右对齐，可以在括号里使用 < > 符号
# 箭头朝左就是左对齐，箭头朝右就是右对齐
print(f"|{'abc':>10}|{300:<10}|")  # '|       abc|300       |'


def calcTax1(salary5):
    tax5 = int(salary5) * 25 / 100
    aftertax5 = int(salary5) * 75 / 100
    print(f'税前薪资是：{salary5:<8}元， 缴税：{tax5:<8}元， 税后薪资是：{aftertax5:<8}元')


calcTax1(8320)
calcTax1(15023)
calcTax1(100030)


# 运行结果如下：
# 税前薪资是：8320    元， 缴税：2080.0  元， 税后薪资是：6240.0  元
# 税前薪资是：15023   元， 缴税：3755.75 元， 税后薪资是：11267.25元
# 税前薪资是：100030  元， 缴税：25007.5 元， 税后薪资是：75022.5 元


# 2.3.小数点后位数
# 如果我们想指定小数点后保留几位，可以像这样 {salary:<8.1f}
# 后面的.1f就表示小数点后面保留1位
def calcTax2(salary6):
    tax6 = int(salary6) * 25 / 100
    aftertax6 = int(salary6) * 75 / 100
    print(f'税前薪资是：{salary6:8.1f}元， 缴税：{tax6:8.1f}元， 税后薪资是：{aftertax6:8.1f}元')


calcTax2(8320)
calcTax2(15023)
calcTax2(100030)


# 运行结果如下：
# 税前薪资是：  8320.0元， 缴税：  2080.0元， 税后薪资是：  6240.0元
# 税前薪资是： 15023.0元， 缴税：  3755.8元， 税后薪资是： 11267.2元
# 税前薪资是：100030.0元， 缴税： 25007.5元， 税后薪资是： 75022.5元


# 2.4.不足补零
# 如果我们想在不足指定宽度的时候不是补空格，而是补数字0，可以像这样 {salary:08}
def calcTax3(salary7):
    tax7 = int(salary7) * 25 / 100
    aftertax7 = int(salary7) * 75 / 100
    print(f'税前薪资是：{salary7:08}元， 缴税：{tax7:08.1f}元， 税后薪资是：{aftertax7:08.1f}元')


calcTax3(8320)
calcTax3(15023)
calcTax3(100030)


# 运行结果如下：
# 税前薪资是：00008320元， 缴税：002080.0元， 税后薪资是：006240.0元
# 税前薪资是：00015023元， 缴税：003755.8元， 税后薪资是：011267.2元
# 税前薪资是：00100030元， 缴税：025007.5元， 税后薪资是：075022.5元

# 上面的例子是对 数字 的不足补零，如果要对 字符串 不足补零，就应该 使用符号 < 或者 > 同时指定左右对齐方式。
var = '34324'

# print(f'{var:08}')
# 报错：
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ValueError: '=' alignment not allowed in string format specifier

print(f'{var:<08}')  # '34324000'
print(f'{var:>08}')  # '00034324'

# 2.5.16进制格式化数字
# 用 x 表示格式化为16进制，并采用小写格式
print(f'数字65535的16进制表示为：{65535:x}' )
# 用 X 表示格式化为16进制，并采用大写格式
print(f'数字65535的16进制表示为：{65535:X}')

# 2.6.字符串内容里有花括号
# 采用 f-string 方式格式化的 字符串内容本身就有 { 或者 } 符号，一定要 双写 进行转义，否则会被当成是 格式化占位符。
# 比如 我们要格式化的字符串为 文章中 { 符号 出现了 xx 次
times1 = 1000
times2 = 2000
print(f'文章中 {{ 符号 出现了 {times1} 次')
print(f'文章中 }} 符号 出现了 {times2} 次')
